home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / mmdf / mmdf-IIb.43 / uip / send / s_post.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-05-11  |  5.2 KB  |  240 lines

  1. /* name:
  2.     post (and various utility routines)
  3.  
  4. function:
  5.     To post a message by interacting with submit.
  6.  
  7. parameters:
  8.     none
  9.  
  10. globals:
  11.     to, cc, subject, vcc, and bigbuf containing the message to be sent.
  12.     nsent, number of successful posts
  13.  
  14. calls:
  15.     various lm routines
  16.     various utility routines immediately below
  17.  
  18. called by:
  19.     input
  20.  */
  21.  
  22. /*
  23. **    R E V I S I O N  H I S T O R Y
  24. **
  25. **    03/31/83  GWH    Split the SEND program into component parts
  26. **            This module contains post, do_message and
  27. **            do_an_address.
  28. **
  29. */
  30.  
  31. #include "./s.h"
  32. #include "./s_externs.h"
  33.  
  34. post ()
  35. {
  36.     int     retval;
  37.  
  38.     if( badflg )    /*  died on previous attempt */
  39.     if (rp_isbad (retval = mm_init ()) || rp_isbad (retval = mm_sbinit ()))
  40.        snd_abort ("Problem with mail restart [%s].\n", rp_valstr (retval));
  41.     badflg = FALSE;
  42.     do_message ();
  43.     fflush (stdout);
  44. }
  45.  
  46. do_message ()
  47. {
  48.     struct rp_bufstruct thereply;
  49.     int        len;
  50.     int     retval;
  51.     char    addr[ADDRSIZE];       /* Next address to process */
  52.  
  53.     if (to[0] != '\0')
  54.     {
  55.     if (bcc[0] != '\0')
  56.         printf (" --Open recipients--\n");
  57.     if (rp_isbad (retval = mm_winit ((char *) 0, subargs, from)))
  58.         snd_abort ("Problem with mm_winit [%s].\n", rp_valstr (retval));
  59.     if (rp_isbad (retval = mm_rrply (&thereply, &len)))
  60.         snd_abort ("Problem with mm_winit reply [%s].\n", rp_valstr (retval));
  61.     switch (rp_gbval (thereply.rp_val)) {
  62.     case RP_BNO:
  63.     case RP_BTNO:
  64.         snd_abort ("mm_winit error: %s.\n", thereply.rp_line);
  65.     }
  66.  
  67.     for (adrptr = to;; )
  68.         switch (next_address (addr))
  69.         {
  70.         case -1:
  71.            goto nextto;
  72.  
  73.         case 0:
  74.             continue;
  75.  
  76.          default:
  77.             do_an_address (addr);
  78.         }
  79.  
  80.     nextto:
  81.     if (cc[0] != '\0')
  82.         for (adrptr = cc; ; )
  83.         switch (next_address (addr))
  84.         {
  85.             case -1:
  86.                goto nextcc;
  87.  
  88.             case 0:
  89.             continue;
  90.  
  91.              default:
  92.             do_an_address (addr);
  93.         }
  94.     nextcc:
  95.  
  96.     if (badflg)
  97.     {
  98.         printf ("Make header legal and try again.\n");
  99.         if (rp_isbad (retval = mm_end (NOTOK)))
  100.             printf ("Can't terminate submission.\n");
  101.         longjmp (savej, 1);
  102.     }
  103.  
  104.     if (rp_isbad (retval = mm_waend ()))
  105.         snd_abort ("Problem with mm_waend [%s].\n", rp_valstr (retval));
  106.     if (rp_isbad (retval = do_text (NO)))
  107.         snd_abort ("Problem writing message text [%s].\n", rp_valstr (retval));
  108.     }
  109.     else
  110.     printf (" no 'To:' addressees.\n");
  111.  
  112.     if (bcc[0] != '\0')
  113.     {
  114.     if (to[0] != '\0')
  115.         printf (" --Open copies posted--\n");
  116.     printf (" --Blind recipients--\n");
  117.  
  118.     if (rp_isbad (retval = mm_winit ((char *) 0, subargs, from)))
  119.         snd_abort ("Problem with mail's mm_winit [%s].\n", rp_valstr (retval));
  120.     if (rp_isbad (retval = mm_rrply (&thereply, &len)))
  121.         snd_abort ("Problem with mm_winit reply [%s].\n", rp_valstr (retval));
  122.     switch (rp_gval (thereply.rp_val)) {
  123.     case RP_BNO:
  124.     case RP_BTNO:
  125.         snd_abort ("mm_winit error: %s.\n", thereply.rp_line);
  126.     }
  127.  
  128.     for (adrptr = bcc;; )
  129.         switch (next_address (addr))
  130.         {
  131.         case -1:
  132.            goto nextbcc;
  133.  
  134.         case 0:
  135.             continue;
  136.  
  137.          default:
  138.             do_an_address (addr);
  139.         }
  140.  
  141.     nextbcc:
  142.  
  143.     if (badflg)
  144.     {
  145.         printf ("Make header legal and try again.\n");
  146.         if (rp_isbad (retval = mm_end (NOTOK)))
  147.             printf ("Can't terminate submission.\n");
  148.         longjmp (savej, 1);
  149.     }
  150.  
  151.     if (rp_isbad (retval = mm_waend ()))
  152.         snd_abort ("Problem with mm_waend [%s].\n", rp_valstr (retval));
  153.     if (rp_isbad (retval = do_text (YES)))
  154.         snd_abort ("Problem writing message text [%s].\n", rp_valstr (retval));
  155.     }
  156.     if (to[0] != '\0' || bcc[0] != '\0')
  157.     printf (" Message posted.\n\n");
  158.     else
  159.     printf (" *** No addresses to send to!\n\n");
  160. }
  161.  
  162.  
  163. do_an_address (addr)
  164. char    addr[];
  165. {
  166.     struct rp_bufstruct thereply;
  167.     int     retval;
  168.     char    name[ADDRSIZE];
  169.     char    address[ADDRSIZE];
  170.     char    hostname[FILNSIZE];
  171.     int     len;
  172.  
  173.     name[0] =
  174.     address[0]=
  175.     hostname[0] = '\0';
  176.     parsadr (addr, name, address, hostname);
  177.  
  178.     putchar (' ');
  179.     if (name[0] != '\0')
  180.     printf ("%s <", name);
  181.     printf ("%s", address);
  182.     if (hostname[0] != '\0' && !lexequ(hostname, locname))
  183.     printf ("@%s", hostname);
  184.     if (name[0] != '\0')
  185.     putchar ('>');
  186.     printf (":  ");
  187.     fflush (stdout);
  188.  
  189.     if (rp_isbad (retval = mm_wadr (hostname, address)) ||
  190.         rp_isbad (retval = mm_rrply (&thereply, &len)))
  191.     snd_abort ("Problem in do_an_address [%s].\n", rp_valstr (retval));
  192.     switch (rp_gval (thereply.rp_val))
  193.     {
  194.     case RP_AOK:
  195.         printf ("address ok\n");
  196.         nsent++;
  197.         break;
  198.  
  199.     case RP_DOK:
  200.         printf ("Nameserver timeout; accepted for resubmission\n");
  201.         nsent++;
  202.         break;
  203.  
  204.     case RP_NAUTH:
  205.         printf ("Not Authorised: %s \n", thereply.rp_line);
  206.         nsent++;
  207.         break;
  208.  
  209.     case RP_NO:
  210.         printf ("not deliverable; unknown problem\n");
  211.         badflg = TRUE;
  212.         break;
  213.  
  214.     case RP_USER:
  215.         printf ("not deliverable: %s\n", thereply.rp_line);
  216.         badflg = TRUE;
  217.         break;
  218.  
  219.     case RP_NDEL:
  220.         printf ("not deliverable; permanent error.\n");
  221.         badflg = TRUE;
  222.         break;
  223.  
  224.     case RP_AGN:
  225.         printf ("failed, this attempt; try later\n");
  226.         badflg = TRUE;
  227.         break;
  228.  
  229.     case RP_NOOP:
  230.         printf ("not attempted, this time; perhaps try later.\n");
  231.         badflg = TRUE;
  232.         break;
  233.  
  234.     default:
  235.         snd_abort ("Unexpected address response:  [%s] %s\n",
  236.             rp_valstr (thereply.rp_val), thereply.rp_line);
  237.     }
  238.     fflush (stdout);
  239. }
  240.